import { setList, getList } from "./const/subApps.js";
import { rewriteRouter } from "./router/rewriteRouter.js";
import { currentApp } from "./utils/index.js";
import { setMainLifeCycle } from './const/mainLifeCycle.js';
import { prefetch } from "./loader/prefetch.js";
import { Custom } from './customevent/index.js';

// 可以在微前端框架里面做一个监听，那么我们如何在子应用里也能使用到同样的 custom 呢？
const custom = new Custom();
// custom.on('test', (data)=>{
//   console.log(data);
// });

// 那么这个呢我们就可以将我们当前的 custom 变量赋值到我们的全局 window 对象上
window.custom = custom;

// 实现路由拦截
rewriteRouter();

// 注册子应用
export const registerMicroApps = (appList, lifeCycle) => {
  setList(appList);

  /* lifeCycle.beforeLoad[0](); // 如何通过我们主应用的生命周期去对应的控制我们主应用的内容显示

  setTimeout(() => {
    lifeCycle.mounted[0](); // loading 加载状态的控制
  }, 3000); */

  setMainLifeCycle(lifeCycle);
};

// 启动微前端框架
export const start = () => {
  // 首先验证当前子应用列表是否为空
  const apps = getList();
  if (!apps.length) {
    // 子应用列表为空
    throw new Error("子应用列表为空，请正确注册");
  }
  // 有子应用的内容，查找到符合当前路由的子应用
  const app = currentApp();
  if (app) {
    const { pathname, hash } = window.location;
    const url = pathname + hash; // /vue3/#/select
    window.__CURRENT_SUB_APP__ = app.activeRule; // 当前的子应用
    // 需要将 window.__CURRENT_SUB_APP__ = app.activeRule 这个代码放在 pushState 上面，如果放在下面的话会先执行 isTurnChild 方法了，这样 isTurnChild 方法中的 window.__CURRENT_SUB_APP__ 这个变量就会是 undefined
    // 这样保证 pushState 事件触发的时候保证 window.__CURRENT_SUB_APP__ 是有值的
    window.history.pushState("", "", url);
  }
  // 预加载 - 加载接下来的所有子应用，但是不显示
  // 对于 prefetch 来说我们当前所有加载的方法其实都是异步的方法，这里呢我们使用 await 来做一个等待，那么对于接下来 prefetch 之后并没有任何其它的操作那么这个 await 呢我们也可以省略掉
  // await prefetch();
  prefetch();
};
